"""
本脚本用来爬取杭州2011年1月1日到2010年11月10日的所有天气信息
网站：http://lishi.tianqi.com/hangzhou/202009.html

分析页面网站规律
    2011年1月 ：网址http://lishi.tianqi.com/hangzhou/201101.html
    2011年2月 ：网址http://lishi.tianqi.com/hangzhou/201102.html
    2011年3月 ：网址http://lishi.tianqi.com/hangzhou/201103.html
    ...
    2020年11月 ：网址http://lishi.tianqi.com/hangzhou/202011.html

注意：由于11月内容只记录到10号，所以需要特别的处理方式

分析页面结构
    发现我们需要的内容是在class='thrui'的列表项下




"""
import os
import numpy as np
import pandas as pd
import requests
from bs4 import BeautifulSoup

# url='http://lishi.tianqi.com/hangzhou/201101.html'
# header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36'}
# res=requests.get(url,headers=header)
# sp=BeautifulSoup(res.text) #转成BeautifulSoup
# li_list = sp.find_all("ul", "thrui")[0].find_all('li')
#
# per_month_data_list=[]
# for li in li_list:
#     divs=li.find_all('div')
#     per_date_list=[]
#     for div in divs:
#         text=div.string
#         # print(text)
#         per_date_list.append(text)
#     per_month_data_list.append(per_date_list)
# print(per_month_data_list)


def date_range():
    """
    获取日期范围
    :return:
    """
    years=[year for year in range(2011,2021)]
    months=[month for month in range(1,13)]
    all_month=[]
    for y in years:
        for m in months:
            f_m=str(m) if m>=10 else '0{}'.format(m)
            year_month=str(y)+f_m
            if year_month!='202012':
                all_month.append(year_month)
    return all_month



def get_month_data(year_month):
    """
    传入具体年月时间，得到该月的所有天气数据
    :param year_month:201101-202011
    :return:
    """
    url = 'http://lishi.tianqi.com/hangzhou/{}.html'.format(year_month)
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36'}
    res = requests.get(url, headers=header)
    sp = BeautifulSoup(res.text)  # 转成BeautifulSoup
    li_list = sp.find_all("ul", "thrui")[0].find_all('li')

    per_month_data_list = []
    for li in li_list:
        divs = li.find_all('div')
        per_date_list = []
        for div in divs:
            text = div.string
            # print(text)
            per_date_list.append(text)
        per_month_data_list.append(per_date_list)
    print(per_month_data_list)
    return per_month_data_list
# print(date_range())

def get_all_data():

    data=[]
    dates=date_range()
    print('一共{}月'.format(len(dates)))
    for i in dates:
        per_month_data_list=get_month_data(i)
        data.extend(per_month_data_list)  #加进去
        print('第{}月完成'.format(i))

    df=pd.DataFrame(np.array(data),columns=['日期','最高气温','最低气温','天气','风向'])
    out_path='杭州2011年1月至2020年11月历史天气.csv'
    df.to_csv(out_path)
    print('输出完成: '+out_path)



get_all_data()












